В 90% случаев ты должен уметь всё делать сам и ландшафт и триггеры и модели и идеи и иконки, ты не найдёшь себе себе триггерщика и моделлера, имея на карте "никакой" ланд, гуи триггеры и миллион амбиций, но в тоже время требовать идеи и предложения.
И опять таки у тебя должен быть практический готовый проект на бумаге, чтобы у других возникла мысль: Да, чёрт! как же это классно!, я хочу в этом поучаствовать! У меня есть...
И снова же надо принять за должное что, будь готов делать практически всё сам (я кажется уже повторился). Команду картоделов свободных найти в 2019 нереально, ибо те что были раньше так круты, что ушли в другие проекты и на другие ЯП, остались лишь ярые фанаты, которые что-то знают но пилят своё, те кто бросил, но могут ещё теоретически что-то вспомнить, ну и новички, которые с трудом старше варкфта, с такими проект не составить, они сами нуждаются в помощи. Так же можно сделать карту не умея ничего, можно доставать всех и просить делать за тебя чуть ли не по триггеру, обещая добавить в титры, но на это уже никто не купится
Дело было в оптимизаторе.По крайней мере ,когда он включён,вылет происходит аж на 16-17 минуте.Без него спокойно играется и до часа.(до вылета просто не было проверено)
Было создано 22 366 679 экземпляров класса CUnitListNode, которые заняли 255.9 МБ памяти.
При очередной попытке выделения, игра упала.
Виной всему утечки памяти: за 21 минуту набралось 80 тысяч групп и 20 тысяч точек.
Также, из-за выполнения большого количества кода, сильно лагает.
На стадии выбора героя (первые две минуты), выполняется 550 000 операций в секунду, а далее — 1 200 000.
Для сравнения: лимит потока — 300 000 операций.
Хорошо, что ты приложил карту, так как в логе маловато информации.
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
Вобщем, с какого-то ... не работал цикл. Пришлось поставить просто подряд много повторяющихся действий (развернуть цикл и прописать отдельно каждое из его повторений), так заработало. Странный этот редактор...
При осмотре карты тоже не совсем понял почему игра перестает строительство. Как решение, ты можешь даммику строительства поменять расу на нежить, таким образом уже здание само будет достраиваться.
Поскольку у тебя на карте при беглом осмотре юнитов строителей я не заметил, то выше указанное решение как раз то что нужно тебе.
П.С.
Под какую версию игры рассчитана данная карта?
Думаю, что можно сделать через группу. В твоём триггере просто перебираешь всех юнитов и двигаешь куда тебе нужно. Тогда тебе нужно будет только добавлять в группу новых юнитов, которые должны так двигаться. А если не хочешь, чтобы юнит двигался - удаляешь его из группы.
Например, создаешь триггер, который регистрирует новых юнитов, вошедших в карту. В условии проверяешь тип юнита. Если подходит, то добавляешь его в ту группу, что я описал выше.
Ну я сделал, короче, добавив два триггера. Один отлавливает любой приказ дамочки во время сальто и устанавливает ей скорость анимации в 10000х(время таймера+0,01)%, потом устанавливает анимацию соответствующего сальто и запускает таймер на 0,01 секунду. Второй по истечению этого таймера устанавливает дамочке скорость анимации 100%.
Выглядит временами не особо гладко, но в целом меня устраивает. Только надо немножко подкорректировать анимации модели.
Как вариант, раз вы не паузите юнита, он может заагриться на кого-то и проигрываемая вами анимация сбросится на анимацию атаки.
Он и правую кнопку в землю нажать может и всё сбросится.
Я уже решил проблему ускорением и новым таймером, хотя всё равно смотрится так себе, но работает.
Анимация вращения "как у акса" но была с названием "spell, slam" поэтому не мог её к вихрю прикрутить.
Нет универсальных решений нет и врятли будут, тут все надо своими руками, лучше для некоторых баффов юзать триггеры чтобы отследить смерть событием TriggerRegisterDeathEvent а так же применение диспелящих способностей на цель, либо самой целью.
Лучше пересмотрите архитектуру своего кода!
А если Вы на 100500 процентов уверенны в правильности своего подхода, то идею в студию. Иначе экстрасэнсы в отпуске и вам никто не поможет.
для блендера есть только один плагин - импортёр...
который глючный и совсем негодный...
напрямую конвертить не получится...
уж тем более с анимациями...
есть вариант конверта в милкшейп (опять че через сторонний аддон), а оттуда в .мдх
конвертит хорошо, с костями, но анимацию убивает...
есть NeoDex для 3dsMax, в котором по плану можно делать всё и конвертить напрямую в .мдх...
через obj не над там копируються вершины а то и несколько раз и слои слепляются в 1,3ds и через милкшарп,еси напрямую в мделвис то uv будет зекальна по y,а лутше перкинуть через макс(еси есть)
ну полигонам то укладывайся в 10к на супер хд моделей
материал ты не как не перенесешь только текстуру
материалы для вара создаются в warcraft model editor
Да, можно сделать модель в блендере. Насчет анимаций не знаю, но на hiveworkshop кажется есть модель рыцаря целиком сделанная в blender. Геометрию и развертку перенести точно можно.
Делаешь модель. В блендере задаешь развертку. Экспортируешь модель в mdl формат. На сайте есть всё необходимое для этого. Если делаешь модель в новой версии blender, придётся сперва открыть готовую модель в более старой версии blender, поддерживающей экспорт. Mdl конвертируешь в mdx. (Конвертер есть на сайте) А потом в mdlvis и war3 model editor допиливаешь до играбельного вида.
Текстуру по развертке рисуешь в фотошопе. Сохраняешь в png. Конвертируешь в blp. (Программа есть на сайте) В mdlvis проверяешь.
Fraps, в настройках сферы есть пунк - Атак включено, это индекс атаки которую она включает (ставим 1 или 0).
Так же в настройках второй атаки героя, пишем допустимые цели - нет, дальность 0, кд 3600 и все, можно юзать любой из способов.
Talgar2, так путь задай неактивной ReplaceableTextures\CommandButtonsDisabled\DISBTNAbilDoubleStrike.blp. Но вообще мне кажется, что ты чего-то в РО не так сделал, так как неактивная иконка нужна во время пауз, например, когда меню открываешь. Скинь лучше карту с этой способностью и иконками.
Создай способность "Книга заклинаний". Туда кидай все способности, которые хочешь скрыть. Потом через действие "Игрок - Включить/Выключить способность" (SetPlayerAbilityAvailable) скрой этот спелбук. Иконок не будет, способности будут. А для описаний всех скилов - один создай, пустышку, или не пустышку. Но это всё касается пассивок. Незнаю как с активными скилами.
Меняешь расширение с .w3n на .mpq (хоть простым переименованием) и открываешь архив любым MPQ-едитором (лично я пользовался этим xgm.guru/p/wc3/ladiks-mpq). После экспортируешь оттуда нужную тебе карту.
Попробуй конвертировать через war3 image extracror, а в фш сохрани картинку как 32 битную. Ну и разумеется разрешение 512х512
Когда будешь вставлять в карту, закинь картинку в мапу , а еще тебе понадобится LoadScreen.mds. В свойствах карты на загрузочный экран установишь LoadScreen.mdx, ну это я так, на всякий случай. Саму картинку нужно назвать FullScreen.blp
И длительность звука сократил, и не с первого кадра анимации, как и у Стрелка сделал, и поместил внутри war3x.mpq, а не просто в карту импортировал, и поместил звук в модели отдельно, как и у Стрелка, а не привязал к кости, и много чего ещё пробовал, но так и не воспроизводит звук, да. Уже удалил всё, но сейчас пришло в голову, что может быть таблицы надо было не в war3x.mpq помещать, а в war3Patch.mpq. Только это вряд ли, потому что даже при импорте в карту ничего не было.
Судя по всему - это некий приоритет. Т.е. если в одну казарму\магазин положишь несколько юнитов\предметов с указанным одинаковым местом расположения, то первым встанет тот, у которого положение вставки больше (а может меньше).
Чисто для галочки:
Три года назад он мне уже писал.
Я ему поэтапно, с его "да/нет", сделал некий ряд изменений в скрипте карты.
По итогу я скинул ему карту, и он ответил мне - "Хорошо, я посмотрю и скину деньги"
С тех пор, он так ни разу и не написал...
Сейчас же, когда я ему об этом напомнил, он отвечает что-то типа "у меня нет переписки".
Я ему скопировал его же сообщения, от отвечает - "А, ну значит мне что-то не понравилось"
Я понял, что процесс сделан как и "MPQEditor", но всё равно не доганяю. Объясните или киньте ссылку с объяснением, так как я не нашёл инфы на это.
тебе объяснили
прога редактирует файл
Я например не знаю как это делать.
статьи по с++/java/любойдругойяп ждут тебя
У меня такое впечатление складывается что ты со мной как с нубом разговариваешь.
тебе показалось (за исключением этого коммента)
Ок. Но лучше ответ бы, чем отправлять меня в тёмный лес. =(
это и есть ответ
если тебе надо
Напиши мне раз умный. Я например не знаю как это делать. И потом дай мне и инструкцию напиши к ней. =\
то ты ошибся адресом
это Q/A а не сделай всё за меня
тебе объяснили что надо редактировать и чем
что ещё тебе надо объяснить?
как печатать на клаве или как сохранять отредактированный файл? BaHeK:
war3map.imp - бинарный файл и редактируют его не блокнотом, НЕХ-редактором. Ну и к тому-же там особая структура файла.
блокнот прекрасно справляется
короче ответ на вопрос дан (только злые люди прогу для автора не написали)
поэтому клоз
и контрольный в голову статья про сабж
Переделывайте юнитов, с нуля. Как и код подправьте, ид юнитов\предметов (да всего) это числа от N и до хрен знает сколько, это все данные в таблице, когда удаляете эти обьекты остаются незанятые ячейки, ну из 250 юнитов, осталось только 150, 100 ячеек пустые вот и багует редактор.
проверил, все работает, всем спасибо)
в коде будет примерно такой вид:
function getTrajectoryRadius takes real speed, real rotationSpeed returns real
local real N = 360 / rotationSpeed // количество сторон вписанного многоугольника
return speed / (2 * (Sin (PI / N)))
endfunction
Я пробовал каналом с заданным приказом patrol. Когда отдаем приказ patrol, то получается что юнит не патрулирует, а бежит кастовать в точку, игноря всех. Я забил на этот способ. Потом пришла новая идея, а вдруг можно абузить этим способом. Представьте, сначала бежит патрулировать в одну точку, а когда дойдет, он же побежит обратно - получит другой приказ, и тут канал срабатывает, и мы узнаем завершение. Короче, не работает. Канал тоже не видит приказы patrol, только в начале SomeFire, ну это понятно. Но мне хочется свою систему патрулирования иметь. Но чекать поиском весь маршрут на наличие противников и прочее, не хочется. Проще отловить начальные приказы patrol, далее ловим завершение приказа, и в завершении готовый patrol отдать в точку, дошел - отдаем новый patrol в точку. дело - отследить.
пока самый оптимальный вариант - это таймером чекать изменилось ли положение маршрута, там нужно интервал таймера сделать больше. И пока работает хорошо, но насколько хорошо - неизвестно. Но я еще забываю, что юниты могут драться, и в патруле могут остановиться и подраться. Ну придется заигнорить патрулирование.
patrol => заменить на attack - тут визуальные эффекты портят все. рамку как найти. можно кое-что сделать))
Ответ выше - для стандартного редактора WE. Однако, рекомендуется использовать с Lua внешний редактор кода и внешний же сборщик карты. Это чревато маленьким неудобством в виде необходимости запускать карту на проверку только из внешней программы т.к. запуск из WE будет без значительной части кода в карте, но дает огромное преимущество в виде несравнимо более удобной работы с кодом.
К сожалению, пока слишком мало информации об этом на сайте.
Вариант NazarPunk, пока без сборки карты, код придется копировать в карту вручную.
Мой вариант, пока не рабочий т.к. перед релизом нужно исправить несколько багов, но включает в себя и работу с кодом и сборку карты, не нужно вручную копировать код в карту.
Даже здесь на сайте есть еще пара вариантов, но мне лень их искать
И немного саморекламы, как выглядели бы ответы на вопрос выше при использовании моего тулсета
Использовать макрос RAW('A0E5'), который превратит равкод в число при сборке карты.
Инжект в функцию main, с заменой оригинальной функции main на свою и вызовом оригинальной функции изнутри нашей.
Аналогично ответу на этот вопрос для чистого WE, но без объявления переменных в WE т.к. то уже не так удобно становится когда код во внешнем редакторе.
Теперь о точках входа и инжекте.
Луа позволяет делать такой финт ушами
do
local f = FunctionName -- записываем функцию в переменную
function FunctionName() -- заменяем оригинальную функцию своей
f() -- вызываем оригинальную функцию из переменной
-- здесь могла быть ваша реклама или ваш код
end
end
Это позволит нам сохранить оригинальную функцию в переменную, заменить оригинал своей функцией и вызвать оригинал из переменной. Применимо к любой функции, которая была объявлена раньше, не работает если функция объявлена после выполнения этого кода. Для создания точки входа отлично подходит InitGlobals, она всегда объявляется раньше кастомного кода в WE и вызывается из main.
У себя в коде я пользуюсь немного более сложным способом, этот код не будет работать в WE т.к. цепляет main, а не InitGlobals и не дает серьеных преимуществ перед описаным выше, привожу просто для расширения кругозора
local function InjectMain()
local alpha_main = main
return function()
local alpha_init = RunInitializationTriggers
RunInitializationTriggers = function() end
alpha_main()
InitLibraries() --моя функция, которая должна быть выполнена после всего, но до триггеров инициализации карты
alpha_init()
end
end
main = InjectMain()
Бтв, про сбор команды - для продвинутых сущностей нередко исправлять за другими оказывается тяжелее, чем делать самому, важно создать максимально комфортные условия для созидания, вот для чего деньги не лишние, а уж дело и самому можно делать.
И, да, тема-то не про то, надо это или не надо, а про то, как лучше это сделать, я про это и в стартовом сообщении написал.
Я на крайний сам вопрос по варианту 3 проверю и/или будет сделан выбор между третьим вариантом, вторым, каким-то ещё и отказом от Cooldown Reduction, но если кто поможет - спасибо.
DemonoiD, Нет, да и лимит не всегда был 8 мб, недавно с четырёх подняли (относительно времени жизни варкравта).
Снова есть ретурн баг, подгружаешь микс архив всем кто запустил карту без их ведома и подключаешь, пусть улыбаются.
Правда могут быть проблемы с некоторыми античитами.
Такого события нету. Оно в общем то не очень нужное, ибо можно просто использовать периодический триггер и сравнивать по содержанию юнитов в группах в разные периоды времени. Тут и вхождение, и выход из радиуса можно сделать.
MrSlendyBoy, да чего ты пристал, не знаю если я? Искал бы видео, если его хочешь, а здесь помогают найти путь к решению проблемы, а не решают за тебя (иногда решают, когда быстрее сделать, чем объяснить, но надо уметь делать).
Нужные проги: Вовмолелвивер, 3дсмакс с плагинами на м2 и mdl и mdl>mdx конвентер.
Достаешь из Вивера модель в формате м2 и текстуру с расширением skin, импортируешь в Макс, сохраняешь в mdl формат, затем конвентируешь в mdx. На декор без анимации занимает 5 минут времени.
Wyett, ты можешь добавлять подобные этим:
function ... takes ... returns ...
Код
endfunction
Резака купить можно, но это будет абсолютно не похоже на покупку дирижабля.
library GroupUtils
//******************************************************************************
//* BY: Rising_Dusk
//*
//* This library is a simple implementation of a stack for groups that need to
//* be in the user's control for greater than an instant of time. Additionally,
//* this library provides a single, global group variable for use with user-end
//* enumerations. It is important to note that users should not be calling
//* DestroyGroup() on the global group, since then it may not exist for when it
//* it is next needed.
//*
//* The group stack removes the need for destroying groups and replaces it with
//* a recycling method.
//* function NewGroup takes nothing returns group
//* function ReleaseGroup takes group g returns boolean
//* function GroupRefresh takes group g returns nothing
//*
//* NewGroup grabs a currently unused group from the stack or creates one if the
//* stack is empty. You can use this group however you'd like, but always
//* remember to call ReleaseGroup on it when you are done with it. If you don't
//* release it, it will 'leak' and your stack may eventually overflow if you
//* keep doing that.
//*
//* GroupRefresh cleans a group of any shadow references which may be clogging
//* its hash table. If you remove a unit from the game who is a member of a unit
//* group, it will 'effectively' remove the unit from the group, but leave a
//* shadow in its place. Calling GroupRefresh on a group will clean up any
//* shadow references that may exist within it.
//*
globals
//* Group for use with all instant enumerations
group ENUM_GROUP = CreateGroup()
//* Temporary references for GroupRefresh
private boolean Flag = false
private group Refr = null
//* Assorted constants
private constant integer MAX_HANDLE_COUNT = 408000
private constant integer MIN_HANDLE_ID = 0x100000
//* Arrays and counter for the group stack
private group array Groups
private integer array Status[MAX_HANDLE_COUNT]
private integer Count = 0
endglobals
private function AddEx takes nothing returns nothing
if Flag then
call GroupClear(Refr)
set Flag = false
endif
call GroupAddUnit(Refr, GetEnumUnit())
endfunction
function GroupRefresh takes group g returns nothing
set Flag = true
set Refr = g
call ForGroup(Refr, function AddEx)
if Flag then
call GroupClear(g)
endif
endfunction
function NewGroup takes nothing returns group
if Count == 0 then
set Groups[0] = CreateGroup()
else
set Count = Count - 1
endif
set Status[GetHandleId(Groups[Count])-MIN_HANDLE_ID] = 1
return Groups[Count]
endfunction
function ReleaseGroup takes group g returns boolean
local integer stat = Status[GetHandleId(g)-MIN_HANDLE_ID]
local boolean b = true
if g == null then
debug call BJDebugMsg(SCOPE_PREFIX+" Error: Null groups cannot be released")
set b = false
elseif stat == 0 then
debug call BJDebugMsg(SCOPE_PREFIX+" Error: Group not part of stack")
set b = false
elseif stat == 2 then
debug call BJDebugMsg(SCOPE_PREFIX+" Error: Groups cannot be multiply released")
set b = false
elseif Count == 8191 then
debug call BJDebugMsg(SCOPE_PREFIX+" Error: Max groups achieved, destroying group")
call DestroyGroup(g)
set b = false
else
call GroupClear(g)
set Groups[Count] = g
set Count = Count + 1
set Status[GetHandleId(g)-MIN_HANDLE_ID] = 2
endif
return b
endfunction
endlibrary
function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
Вот так переделал
...
local group gg = null
...
set TempG = LoadGroupHandle(udg_Hash,i,4)
set TempReal = LoadReal(udg_Hash,i,3)
call ForGroup(g,function move1)
set gg = CopyGroup(TempG)
call SaveGroupHandle(udg_Hash,i,4,gg)
call GroupClear(TempG)
set TempG = null
...
Хотя вроде каждые 0.03 сек создаётся новая группа, а удаляется лишь один раз вместе с таймером, мне кажется там утечек из-за этого дофига. Но это чуть позже проверю, в таком случае откажусь от ForGroup
Да, к сожалению оно вызывает утечки, но это было очевидно. Копирование группы лучше использовать для локальных групп, которые можно будет потом уничтожить. В общем перенесу всё в луп
Код
private function move takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local group g = LoadGroupHandle(udg_Hash,i,0)
local group gg = CopyGroup(g)
local group ggg = CreateGroup()
local group g1 = LoadGroupHandle(udg_Hash,i,4)
local real d = LoadReal(udg_Hash,i,2)+WavesSpeed
local real a
local unit u = null
local unit uu = null
loop
set u = FirstOfGroup(gg)
exitwhen u == null
set a = GetUnitFacing(u)*bj_DEGTORAD
call SetUnitX(u,GetUnitX(u)+WavesSpeed*Cos(a))
call SetUnitY(u,GetUnitY(u)+WavesSpeed*Sin(a))
set bj_groupEnumOwningPlayer = GetOwningPlayer(u)
call GroupEnumUnitsInRange(ggg,GetUnitX(u),GetUnitY(u),WaveRadius,Condition(function myfilt))
set bj_groupEnumOwningPlayer = null
loop
set uu = FirstOfGroup(ggg)
exitwhen uu == null
if not IsUnitInGroup(uu,g1) then
call UnitDamageTarget(u,uu,LoadReal(udg_Hash,i,3),true,false,AttackType,DamageType,WeaponType)
call GroupAddUnit(g1,uu)
endif
call GroupRemoveUnit(ggg,uu)
set uu = null
endloop
call GroupRemoveUnit(gg,u)
set u = null
endloop
if d >= LoadReal(udg_Hash,i,1) then
DisplayTextToPlayer(Player(0),0,0,I2S(1))
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,i)
call ForGroup(g,function kill)
call GroupClear(g)
call DestroyGroup(g)
call GroupClear(g1)
call DestroyGroup(g1)
else
call SaveReal(udg_Hash,i,2,d)
endif
call DestroyGroup(gg)
call DestroyGroup(ggg)
set g = null
set gg = null
set ggg = null
set g1 = null
set t = null
set g = null
endfunction
Что это за абилку я делаю, можете посмотреть с 20.12.2020 вечером в моём блоге)) Да, это реклама говноабилок, я лох
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
function IsUnitBack takes unit uF, unit uWhichBack returns boolean
real r1 = bj_RADTODEG * Atan2(GetUnitY(uWhichBack) - GetUnitY(uF), GetUnitX(uWhichBack) - GetUnitX(uF)) + 360.
real r2 = GetUnitFacing(uWhichBack) + 360.
if GetUnitY(uWhichBack) < GetUnitY(uF) then
set r1 = r1 + 360.
endif
return (r1<=(r2+45.) and r1>=(r2-45.))
endfunction
на сколько я понял твой триггер срабатывает при получении урона определённым юнитом
и ты вызываешь в нём этот триггер
который наносит урон этому самому юниту
в результате опять срабатывает отлов урона
и опять наносится урон
и опять ...
в общем получается рекурсия и вар выкидывает из за переполнения стека
кстати почему бы не сделать отлов урона в 1 триггере?
событие "юнит атакован" срабатывает перед каждой атакой в момент замаха
событие "юнит получает урон" (Specific unit event) срабатывает перед нанесением урона, но это событие нужно добавлять другим триггером отдельно для каждого юнита (Trigger - Add new event)
» WarCraft 3 / Как вам такая карта?
» WarCraft 3 / Странные фаталы
» WarCraft 3 / помощь с триггером
» WarCraft 3 / Анимация во время движения.
» WarCraft 3 / Как триггерно добавить бафф юниту?
» WarCraft 3 / Вопрос по UI
» WarCraft 3 / Экспорт в Blender
» WarCraft 3 / сфера замедления
» WarCraft 3 / Проблема с save/load системой
» WarCraft 3 / Проблемы с ИИ
» WarCraft 3 / Суммирующиеся ауры
Ред. ScorpioT1000
» WarCraft 3 / Положение вставки
» WarCraft 3 / Ищу разработчика для карты Лорды Европы за оплату!
» WarCraft 3 / Как правильно добавлять иконки в карту?
» WarCraft 3 / Пытаюсь создать кастомного героя.
» WarCraft 3 / Ошибка редактора
» WarCraft 3 / Движение по кругу
» WarCraft 3 / Глобальные переменные в Lua
» WarCraft 3 / Дополнительные ресурсы
» WarCraft 3 / TriggerRegisterUnitInRange
» WarCraft 3 / Как импортировать
» WarCraft 3 / Вопрос по коду
» WarCraft 3 / Массовая атака
» WarCraft 3 / Отслеживание атаки юнита